home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / parallax / more_exa.tar / more / X / xfractal.p < prev    next >
Text File  |  1993-03-04  |  2KB  |  73 lines

  1. SYSTEM fractal;
  2. CONST  maxlevel  = 10;
  3.        low_val   = 0.0;
  4.        high_val  = 1.0;
  5.        maxnode   = 2**maxlevel - 1;
  6.        leaf_end  = maxnode;
  7.        leaf_start= (leaf_end+1) DIV 2;
  8.        leaf_num  = leaf_start;
  9.        height    = leaf_num DIV 3;
  10.  
  11. CONFIGURATION tree [1..maxnode];
  12. CONNECTION    child_l: tree[i] <-> tree[2*i].parent;
  13.               child_r : tree[i] <-> tree[2*i+1].parent;
  14.  
  15. SCALAR  i,win          : CARDINAL;
  16.         delta,xmax,xmin: REAL;
  17.         ch             : CHAR;
  18.  
  19. VECTOR  x, low, high   : REAL;
  20.         pos            : CARDINAL;
  21.  
  22. PROCEDURE Gauss(): VECTOR REAL;
  23. (* random number with Gaussian distribution *)
  24. CONST N = 4;
  25.       GA= SQRT(3.0*FLOAT(N));
  26.       GF= 2.0*GA / (FLOAT(N)*FLOAT(MAX(INTEGER)));
  27. SCALAR i  : INTEGER; 
  28. VECTOR sum: REAL;
  29. BEGIN
  30.   sum:=0.0;
  31.   FOR i:=1 TO N DO sum:= sum + FLOAT(VIRandom()) END;
  32.   RETURN (GF*sum - GA)
  33. END Gauss;
  34.  
  35. PROCEDURE MidPointRec(SCALAR delta: REAL; SCALAR level: INTEGER);
  36. BEGIN
  37.   PARALLEL [2**(level-1) .. 2**level - 1]  (* select current tree level *)
  38.     x := 0.5 * (low + high) + delta*Gauss();
  39.     IF level < maxlevel THEN
  40.       SEND tree.child_l (low)  TO tree.parent(low); (* values for children *)
  41.       SEND tree.child_l (x)    TO tree.parent(high);
  42.       SEND tree.child_r (x)    TO tree.parent(low);
  43.       SEND tree.child_r (high) TO tree.parent(high);
  44.     END;
  45.   ENDPARALLEL;
  46. END MidPointRec;
  47.  
  48. BEGIN (* main *)
  49.   PARALLEL
  50.     low  := low_val;   (* starting values *)
  51.     high := high_val;
  52.     x    := 0.0;
  53.   ENDPARALLEL;
  54.  
  55.   FOR i:=1 TO maxlevel DO
  56.     delta := 0.5 ** (FLOAT(i)/2.0);
  57.     MidPointRec(delta,i);
  58.   END;
  59.  
  60.   win  := OpenAbswindow(leaf_num, height); 
  61.   SetColor(COLOR(0,0,0)); (* black *)
  62.   xmin := REDUCE.min(x);
  63.   xmax := REDUCE.max(x);
  64.   PARALLEL [leaf_start..leaf_end]
  65.     pos := height - TRUNC( FLOAT(height-1)* (x-xmin)/(xmax-xmin) );
  66.     SetPixel(DIM1-leaf_start+1, pos);
  67.   ENDPARALLEL;
  68.   WriteString("Press RETURN for termination"); WriteLn;
  69.   Read(ch);
  70.   CloseWindow(win);
  71. END fractal.
  72.  
  73.